package com.vo;

import java.util.ArrayList;
import java.util.List;

/**
 *  Classe Group utilizada como Variable Object.
 * @author Jean Vasconcelos, Carla Sukeyosi, Matheus Emanuel, Heitor Carvalho
 */
public class Group {
    
    private String name;
    private List<Contact> contactList;
    
    //construtores
    /*
     * Cria um Grupo a partir do nome. Neste caso a lista<contatos(Contact) é null.
     */
    public Group(String name)
    {
        this(name, null);
    }
    
    /**
     * Cria um grupo a partir do nome e da lista<contatos(Contact)>.
     * @param name
     * @param list 
     */
    public Group(String name, List<Contact> list)
    {
        if (list == null)
            contactList = new ArrayList<Contact>();
        this.name = name;
        contactList = list;
    }
    
    /**
     * Recupera a lista<contatos> que são os Contatos(Contact) que fazem
     * parte do Grupo.
     * @return Lista<contatos> do Grupo.
     */
    public List<Contact> getContactList() {
        return contactList;
    }
    
    /**
     * Recupera o nome do Grupo.
     * @return Nome do Grupo.
     */
    public String getName() {
        return name;
    }
    
    /**
     * Modifica o nome do Grupo.
     * @param name Novo nome.
     */
    public void setName(String name) {
        this.name = name;
    }
    
    /**
     * Modifica a lista<contatos(Contact)> do Grupo.
     * @param newList 
     */
    public void setContactList(List<Contact> newList)
    {
        contactList = newList;
    }
    
    /**
     * Remove Contato(Contact) da lista<contatos> do Grupo.
     * @param contact Contato a ser removido.
     * @return true se o elemento for removido da lista.
     */
    public boolean removeContact(Contact contact)
    {
        return contactList.remove(contact);
    }
    
    /**
     * Adiciona Contato(Contact) na lista<contatos> do Grupo.
     * @param contact Contato a ser adicionado.
     * @return true se o elemento for adicionado na lista
     */
    public boolean addContact(Contact contact)
    {
        if (!contactList.contains(contact))
            return contactList.add(contact);
        return false;
    }
    
    /**
     * Verifica se dois grupo são iguais, no caso te possuirem o mesmo nome.
     * @param obj Grupo a ser comparado.
     * @return true se os Grupo forem iguais.
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) 
            return false;
        
        if (getClass() != obj.getClass()) 
            return false;
        
        final Group other = (Group) obj;
        
        if (other.hashCode() != this.hashCode() )
            return false;
        
        return true;
    }
    
    /**
     * Gera o hashcode do Grupo a partit do nome.
     * @return Hashcode do Grupo.
     */
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 29 * hash + (this.name != null ? this.name.hashCode() : 0);
        return hash;
    }

    /**
     * Representação do Grupo num String.
     * @return String contendo as informção do Grupo.
     */
    @Override
    public String toString() {
        return "Grupo: " + name + "\n Contatos do Grupo: \n" + contactList;
    }
}
